package com.shrio.shrio_demo.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Author Zhang Chao
 * @Date 2021/3/25 16:37
 * @Version 1.0
 */

@Configuration//申明这是个配置类
public class ShiroConfig{
    //创建realm对象 :1
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }
    //DefaultWebSecurityManager 该类对应SecurityManager(安全管理器) :2
    @Bean//通过Qualifier注解去指定我们realm对象
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联UserRealm对象 因为我们需要从realm对象中获取安全数据
        securityManager.setRealm(userRealm());
        return securityManager;
    }
    //创建ShiroFilterFactoryBean :3
    @Bean//通过Qualifier注解去指定我们安全管理器
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager safetyManager){
        //ShiroFilterFactoryBean对象 它是shiro和spring整合的关键
        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        //通过bean去设置安全管理器
        bean.setSecurityManager(safetyManager);
        /*  shiro中内置的过滤器
            - anon： 无需认证就可以访问
            - authc： 必须认证了才能访问
            - user： 必须拥有记住我功能才能用
            - perms： 拥有对某个资源的权限才能访问
            - role： 拥有某个角色权限
         */
        Map<String, String> filterMap = new LinkedHashMap<>();
        //访问/user/add 是必须认证
        filterMap.put("/user/add","authc");
        filterMap.put("/user/update","authc");
        //将过滤器添加到bean中.如果权限不足会自动访问login.jsp页面
        bean.setFilterChainDefinitionMap(filterMap);
        //我们需要设置权限不足时会打开的页面
        bean.setLoginUrl("/toLogin");
        return bean;
    }

}

